//
//  GGDFUProtocol.h
//  GGDFU
//
//  Created by 陈志勇 on 17/1/14.
//  Copyright © 2017年 陈志勇. All rights reserved.
//

#import <Foundation/Foundation.h>



@interface GGDFUProtocol : NSObject


typedef NS_ENUM(NSUInteger,GGDFUCommandType){
    GGDFUCommandTypeHander     = 0xF8,    ///< 握手
    GGDFUCommandTypeDownload   = 0xF9,    ///< 下载
};


///**  设备地址  */
//@property(assign,nonatomic) NSUInteger address;
///**  命令字类型  */
//@property(assign,nonatomic) GGDFUCommandType CMD;
///**  数据体长度  */
//@property(assign,nonatomic) NSUInteger bodyDataLen;
///**  数据体  */
//@property(strong,nonatomic) NSMutableData *bodyData;
///**  校验和  */
//@property(assign,nonatomic) NSUInteger checkSum;

// 下载数据组包
+ (NSData *)msrKeyWithCommandType:(unsigned char)commandType //命令字
                      contentInfo:(NSData *)contentInfo;
/**
 *  数据块组包
 *
 *  @param infoData    数据块
 *  @param commandType 数据块命令类型
 *
 *  @return 
 */
+ (NSData *)encodeDataWithInfoData:(NSData *)infoData commandType:(NSUInteger)commandType;
/**
 *  NSData 转 16进制字符串
 *
 *  @param responseData NSData数据
 *
 *  @return 16进制字符串
 */
+ (NSString *)dataTohexString:(NSData *)responseData;
/**
 *  16进制字符串 转NSData
 *
 *  @param str 16进制字符串
 *
 *  @return NSData
 */
+ (NSData *)hexStringToData:(NSString *)str;
/**
 *  计算数据的校验和
 *
 *  @param responseData 需要计算的数据
 *
 *  @return 校验和是否正确 YES：正确  NO：错误
 */
+ (BOOL)parseSumWithResponseData:(NSData *)responseData;
/**
 *  应用握手
 *
 *  @return 
 */
+ (NSData *)reset;
/**
 *  引导握手
 *
 *  @param filePath 需要下载的文件路径
 *
 *  @return 组包好的协议数据
 */
+ (NSData *)shakeHandWithFilePath:(NSString *)filePath;
/**
 *  数据块下载
 *
 *  @param packetIndex 数据块包编号
 *  @param infoData    数据块
 *
 *  @return 组包好的协议数据
 */
+ (NSData *)downloadWithPacketIndex:(NSUInteger)packetIndex infoData:(NSData *)infoData;
/**
 *  程序下载完成
 *
 *  @param packetIndex 数据包编号
 *
 *  @return 组包好的协议数据
 */
+ (NSData *)completeWithPacketIndex:(NSUInteger)packetIndex;
/**
 *  解析出蓝牙收到的数据块包
 *
 *  @param responseData 蓝牙收到的数据
 *
 *  @return 解析出的数据块包
 */
+ (NSData *)parseInfoData:(NSData *)responseData;
/**
 *  解析数据块的包编号
 *
 *  @param infoData 数据块
 *
 *  @return 包编号
 */
+ (NSUInteger)parseInfoDataPacketIndex:(NSData *)infoData;
/**
 *  解析数据块的执行情况
 *
 *  @param infoData 数据块
 *
 *  @return 是否成功  YES：成功  NO：失败
 */
+ (BOOL)parseCommandResult:(NSData *)infoData;
@end
